package com.cy.pj.sys.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.UUID;

import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.cy.pj.common.exception.ServiceException;
import com.cy.pj.common.vo.PageObject;
import com.cy.pj.common.vo.UserDeptVo;
import com.cy.pj.sys.dao.UserDao;
import com.cy.pj.sys.dao.UserRoleDao;
import com.cy.pj.sys.entity.User;
import com.cy.pj.sys.service.UserService;

import io.micrometer.common.util.StringUtils;

@Service
public class UserServiceImpl implements UserService {

	@Autowired
	private UserDao userDao;

	@Autowired
	private UserRoleDao userRoleDao;

	/**
	 * 分页查询用户信息
	 * 
	 * @param usermane    用户名
	 * @param pageCurrent 当前页码
	 * @return
	 */
	@Override
	public PageObject<UserDeptVo> findPageObject(String usermane, Long pageCurrent) {

		if (pageCurrent == null || pageCurrent < 1) {
			throw new IllegalArgumentException("页码值错误");
		}

		Long rowCount = userDao.getRowCount(usermane);

		if (rowCount == 0) {
			throw new NoSuchElementException("没有记录");
		}

		Long startIndex = (pageCurrent - 1) * pageSize;

		List<UserDeptVo> users = userDao.findPageObject(usermane, startIndex, pageSize, "createdTime");

		return new PageObject<UserDeptVo>(pageCurrent, pageSize, rowCount, users);
	}

	/**
	 * 修改用户状态
	 * 
	 * @param id           用户id
	 * @param valid        用户状态
	 * @param modifiedUser 修改用户
	 * @return 影响行数
	 */
	@Override
	public Integer validById(Long id, Integer valid, String modifiedUser) {

		modifiedUser = "admin";

		if (id == null || id < 1) {
			throw new IllegalArgumentException("id值无效");
		}
		if (id == null || id < 1) {
			throw new IllegalArgumentException("id值无效");
		}

		if (valid == null || (valid != 0 && valid != 1)) {
			throw new IllegalArgumentException("状态值无效");
		}

		if (userDao.isExits(modifiedUser) < 1) {
			throw new IllegalArgumentException("执行用户不存在");
		}

		Integer row = userDao.validById(id, valid, modifiedUser);

		return row;
	}

	/**
	 * 保存用户及其角色信息
	 * 
	 * @param user    用户对象，包含用户名、密码、邮箱等信息
	 * @param roleIds 用户角色ID数组,表示该用户拥有的角色
	 * @return 影响行数
	 */
	@Override
	public Integer saveObject(User user, Integer[] roleIds) {

		// 参数验证

		if (user == null) {
			throw new IllegalArgumentException("保存的用户不存在");
		}

		if (user.getUsername() == null || user.getUsername().length() < 2 || user.getUsername().length() > 20) {
			throw new IllegalArgumentException("用户名长度必须大于2小于20");
		}

		if (user.getPassword() == null || user.getPassword().length() < 3 || user.getPassword().length() > 20) {
			throw new IllegalArgumentException("密码长度必须大于3小于20");
		}

		if (user.getEmail() == null || user.getEmail().length() < 2 || user.getEmail().length() > 20) {
			throw new IllegalArgumentException("邮箱长度必须大于2小于20");
		}

		// 校验用户是否已经存在
		Integer isExit = userDao.isExits(user.getUsername());

		if (isExit > 0) {
			throw new ServiceException("用户已经存在");
		}

		if (roleIds == null || roleIds.length == 0) {
			throw new IllegalArgumentException("用户至少选择一个角色");
		}

		// 添加盐值和密码保护

		String salt = UUID.randomUUID().toString(); // 随机生成一个字符串,来生成盐值

		// 使用盐值对密码进行加密
		String hashPassword = null;
		// 使用算法对密码进行加密
		// hashPassword = DigestUtils.md5DigestAsHex((user.getPassword() +
		// salt).getBytes());

		// 创建SimpleHash对象
		SimpleHash simpleHash = new SimpleHash("MD5", user.getPassword(), salt, 1);// 参数:加密方式,原值,盐值,加密次数
		// 使用第三方库对密码进行加密
		hashPassword = simpleHash.toHex();

		// 将属性值放置到对象中
		user.setSalt(salt);
		user.setPassword(hashPassword);

		Integer rows = userDao.insertObject(user);

		// 获取保存用户的id值
		Long userId = userDao.getUserIdByUserName(user.getUsername());

		rows += userRoleDao.insertObjects(userId, roleIds);

		return rows;
	}

	/**
	 * 删除用户信息
	 * 
	 * @param id 用户id
	 * @return 影响行数
	 */
	@Override
	public Integer deleteObject(Long id) {

		if (id <= 0) {
			throw new IllegalArgumentException("id值无效");
		}

		Integer row = userDao.deleteObject(id);

		row += userRoleDao.deleteObject(id);
		return row;
	}

	/**
	 * 查询用户信息
	 * 
	 * @param id 用户id
	 * @return 用户信息
	 */
	@Override
	public Map<String, Object> findObjectById(Long userId) {
		// 参数校验
		if (userId == null || userId < 1) {
			throw new IllegalArgumentException("id值无效" + "_findObjectById_method_" + userId);
		}

		// 获取数据
		UserDeptVo user = userDao.findObjectById(userId);

		List<Integer> roleIds = userRoleDao.findRoleIdsByUserId(userId);

		// 将获取的值放入到map集合中
		Map<String, Object> map = new HashMap<>();

		map.put("user", user);
		map.put("roleIds", roleIds);

		return map;
	}

	@Override
	public Integer updateObject(User user,Integer[] roleIds){

		// 参数验证
		if (user == null ) {
			throw new IllegalArgumentException("用户参数为空");
		}

		if (StringUtils.isEmpty(user.getUsername())) {
			throw new IllegalArgumentException("用户名不能为空");
		}
		
		if (userDao.isExitsById(user.getId()) < 1 ) {
			throw new IllegalArgumentException("用户不存在");
		}

		if (roleIds == null || roleIds.length == 0 ) {
			throw new IllegalArgumentException("用户角色信息不存在");
		}
		
		Integer rows = userDao.updateObject(user);
		
		rows += userRoleDao.deleteObject(user.getId());

		rows += userRoleDao.insertObjects(user.getId(), roleIds);

		return rows;
		
	}
}